package configur;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import exception.PluginException;

/**
 * class ApplicationContextImpl.
 * 
 * @author Groupe03-2013
 */
class ApplicationContextImpl implements ApplicationContext, PluginFactory {

	private Properties props = new Properties();

	/**
	 * Charge les propriétés
	 * 
	 * @param urlProperties
	 *            l'adresse de l'emplacement du fichier
	 */
	public void loadProperties(final String urlProperties) {
		try {
			FileInputStream fis = new FileInputStream(
					System.getProperty("user.home") + urlProperties);
			this.props.load(fis);
			fis.close();
		} catch (IOException e) {
			e.printStackTrace();
			throw new PluginException(
					"Impossible d'ouvrir le fichier .properties.");
		}
	}

	/**
	 * Retourne le plugin cherchée pour une classe
	 * 
	 * @param iface
	 *            la classe de...
	 * @return Object le plugin
	 */
	public Object getPluginFor(final Class<?> iface) {
		final String implName = props.getProperty(iface.getName());
		Object o = null;
		try {
			o = Class.forName(implName).newInstance();
		} catch (final Exception e) {
			throw new PluginException("Impossible de charger le plugin.");
		}
		return o;
	}

	/**
	 * Retourne le propriété cherchée
	 * 
	 * @param nom
	 *            propriété à obtenir
	 * @return String propriété
	 */
	public String getProperty(final String nom) {
		try {
			return props.getProperty(nom);
		} catch (Exception e) {
			throw new PluginException("Impossible de récupérer la 'property'");
		}
	}

}
